
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js"><!--<![endif]-->
<head>
  <meta charset="utf-8">
  <title>
    
  如何使用PM2进程管理器, 守护java进程 - LZH-DEV-TECH-SHARE
  

  </title>
  <meta name="author" content="">
  <meta name="description" content="">

  <meta name="HandheldFriendly" content="True">
  <meta name="MobileOptimized" content="320">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  
  <link href="asset/css/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
  <link href="atom.xml" rel="alternate" title="LZH-DEV-TECH-SHARE" type="application/atom+xml">
  <script src="asset/js/modernizr-2.0.js"></script>
  <script src="asset/js/jquery.min.js"></script>
  <script src="asset/highlightjs/highlight.pack.js"></script>
  <link href="asset/highlightjs/styles/solarized_light.css" media="screen, projection" rel="stylesheet" type="text/css">
  <script>hljs.initHighlightingOnLoad();</script>

  <style type="text/css">
  .cat-children-p{ padding: 6px 0px;}
  .hljs{background: none;}
  </style>
  <script type="text/javascript">
  var isAddSildbar = true;
  </script>
  <script src="asset/js/octopress.js" type="text/javascript"></script>
</head>
<script type="text/javascript">
//链接新开窗口
function addBlankTargetForLinks () {
  $('a[href^="http"]').each(function(){
      $(this).attr('target', '_blank');
  });
}
$(document).ready(function(event) {
  addBlankTargetForLinks();
});
</script>
<body   >
  <header role="banner"><hgroup>
  <h1><a href="index.html">LZH-DEV-TECH-SHARE</a></h1>
  
    <h2></h2>
  
</hgroup>

</header>
  <nav role="navigation"><ul class="subscription" data-subscription="rss">
  <li><a href="atom.xml" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
  
</ul>
  
<form action="http://google.com/search" method="get">
  <fieldset role="search">
    <input type="hidden" name="q" value="site:" />
    <input class="search" type="text" name="q" results="0" placeholder="Search"/>
  </fieldset>
</form>
  
<ul class="main-navigation">

  <li id=""><a target="self" href="index.html">Home</a></li>

  <li id=""><a target="_self" href="archives.html">Archives</a></li>

</ul>

</nav>
  <div id="main">
    <div id="content"> 
<div>
	<article class="hentry" role="article">
	<header>
			  	<h1 class="entry-title">如何使用PM2进程管理器, 守护java进程</h1>
				<p class="meta"><time datetime="2018-11-01T19:30:24+08:00" pubdate data-updated="true">2018/11/1</time></p>
			 </header>
		  	<div class="entry-content">
			  	<blockquote>
<p>java程序的进程管理一直是个业界关注的问题, 以往我们可能使用linux开机启动配置的方式来开机启动java程序, 或者依赖于 runit, supervisor等工具来进行java进程的守护, 今天我们来介绍的是一种更加方便的方式, 它就是PM2</p>
</blockquote>

<h2 id="toc_0">回顾</h2>

<p>前文 [PM2使用详解] 中我们可以看到, 使用pm2, 运行一个node程序及其简单, 命令如下: </p>

<pre><code class="language-shell">pm2 start server.js --name=knowledge -i max 
</code></pre>

<p>可以直接运行 js 伺服程序, 并根据及其的cpu核数, 来创建集群.<br/>
这是因为 pm2 是基于node开发的, 于是可以直接执行 js 伺服程序.</p>

<p>那么如何运行java程序呢, 问题就来了.</p>

<h2 id="toc_1">新知识点</h2>

<h3 id="toc_2">Ecosystem File</h3>

<p>这是用来描述pm2如何部署应用的配置文件, 直译过来, 是<code>生态系统文件</code>.<br/>
我们可以通过:</p>

<pre><code class="language-shell">pm2 init
</code></pre>

<p>来创建这个生态系统文件, 名为<code>ecosystem.config.js</code>, 内容如下:</p>

<pre><code class="language-javascript">module.exports = {
  apps : [{
    name: &quot;app&quot;,
    script: &quot;./app.js&quot;,
    env: {
      NODE_ENV: &quot;development&quot;,
    },
    env_production: {
      NODE_ENV: &quot;production&quot;,
    }
  }]
}
</code></pre>

<p>我们可以看出, 这个配置文件可以支持配置多个应用来运行, 其导出的根是个对象, 对象中apps就是我们要部署的应用们, 每一个对象就是我们要部署的一个应用,单个应用的配置结构类似于:</p>

<pre><code class="language-javascript">{
    name: &quot;app&quot;,
    script: &quot;./app.js&quot;,
    env: {
      NODE_ENV: &quot;development&quot;,
    },
    env_production: {
      NODE_ENV: &quot;production&quot;,
    }
}
</code></pre>

<p>这个对象中的每个选项是一个应用运行的options, 要获取其详细的配置可以<a href="https://pm2.io/doc/en/runtime/reference/ecosystem-file/#apps-options">查看这里</a><br/>
其实pm2 还支持运行 配置文件, 其配置文件格式为 json, 基本格式如图.</p>

<pre><code class="language-javascript">{
    &quot;name&quot;: &quot;my-server&quot;,
    &quot;script&quot;: &quot;/usr/bin/java&quot;,
    &quot;args&quot;: [
        &quot;-jar&quot;,
        &quot;server.jar&quot;
    ],
    &quot;exec_interpreter&quot;: &quot;&quot;,
    &quot;exec_mode&quot;: &quot;fork&quot;
}
</code></pre>

<p>怎么样, 有没感觉上面说的 js 对象的结构和 下面的 json 很像, 没错, 我们可以使用json文件来做单个应用的运行配置描述文件, 其中的属性和前述的 <a href="https://pm2.io/doc/en/runtime/reference/ecosystem-file/#apps-options">单个应用运行的options</a> 是完全一致的, 然后运行单个应用, 这个过程中根本不用考虑前面所说的<code>生态系统文件</code>.</p>

<h3 id="toc_3">注意</h3>

<p>在上述的最后json配置文件例子中, 我们 script 运行了 java 程序, 在 args 中, 指定了运行的jar包, 等信息.</p>

<h3 id="toc_4">小结</h3>

<p>基于此, 我们可以使用 pm2 运行 js, java进程了, 那么其他进程是不是也可以呢, 答案是, 当然可以.<br/>
放开脑洞, 我们可以用pm2运行tomcat, spring-boot应用, node koa应用, node express应用, python进程, go进程, natapp 网络隧道进程等等需要挂起 到后台运行的应用进程, 简直不要太棒!</p>

<h3 id="toc_5">如何启动</h3>

<p>很简单, 只需要:</p>

<pre><code class="language-shell">pm2 start json-config-file.json
</code></pre>

<h2 id="toc_6">结论</h2>

<p>至此, 我们可以很开心的用pm2运行各种程序了, 并基于pm2提供的方便的功能, 查看进程的事实情况, 下一节, 我们将讨论如何利用 pm2的 生态系统文件 -&gt; Ecosystem File 来进行应用的自动更新和部署以及不停机发布.</p>

<h2 id="toc_7">参考资料</h2>

<p><a href="https://www.ddhigh.com/2017/07/31/spring-boot-pm2.html">https://www.ddhigh.com/2017/07/31/spring-boot-pm2.html</a><br/>
<a href="https://github.com/daggerok/pm2-java-spring-boot/blob/master/process.json">https://github.com/daggerok/pm2-java-spring-boot/blob/master/process.json</a><br/>
<a href="https://pm2.io/doc/en/runtime/reference/ecosystem-file/#apps-options">https://pm2.io/doc/en/runtime/reference/ecosystem-file/#apps-options</a></p>

			</div>

		
	  
		<footer>
		 <p class="meta">

			<strong>Categories:</strong>&nbsp; 
			<span class="categories">
			
			    <a class='category' href='front-end.html'>front-end</a>&nbsp;
			 
			</span>
		    </p>
		    <p class="meta">
		      
		 </p>
	    
		<div class="sharing">
		  
          

          

		</div>

	    <p class="meta">
	    
	        <a class="basic-alignment left" href="15411425055347.html" 
	        title="Previous Post: LZH-DEV-GROUP Git Workflow 实践详解">&laquo; LZH-DEV-GROUP Git Workflow 实践详解</a>
	    
	    
	        <a class="basic-alignment right" href="15408811446857.html" 
	        title="Next Post: 一篇文章搞定 centos7 上的 mysql 安装">一篇文章搞定 centos7 上的 mysql 安装 &raquo;</a>
	    
	    </p>
	  </footer>
	</article>
</div>
 <aside class="sidebar"> 

	<section>
	  <h1>Categories</h1>
	  <ul id="recent_posts">
	  
	      <li class="post">
	        <a href="version-control.html"><strong>version-control&nbsp;(2)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="shell.html"><strong>shell&nbsp;(1)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="back-end.html"><strong>back-end&nbsp;(4)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="front-end.html"><strong>front-end&nbsp;(5)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="version-control-1.html"><strong>version-control&nbsp;(1)</strong></a>
	        
	        
	        
	      </li>
	  
	      <li class="post">
	        <a href="other.html"><strong>other&nbsp;(2)</strong></a>
	        
	        
	        
	      </li>
	   
	  </ul>
	</section>
	<section>
	  <h1>Recent Posts</h1>
	  <ul id="recent_posts">
	  
	      
		      <li class="post">
		        <a href="15413898294420.html">RESTful API 最佳实践</a>
		      </li>
	     
	  
	      
		      <li class="post">
		        <a href="15411425055347.html">LZH-DEV-GROUP Git Workflow 实践详解</a>
		      </li>
	     
	  
	      
		      <li class="post">
		        <a href="15410718240579.html">如何使用PM2进程管理器, 守护java进程</a>
		      </li>
	     
	  
	      
		      <li class="post">
		        <a href="15408811446857.html">一篇文章搞定 centos7 上的 mysql 安装</a>
		      </li>
	     
	  
	      
		      <li class="post">
		        <a href="15408703788547.html">一篇文章搞定 centos7 下安装 nvm和node</a>
		      </li>
	     
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	  
	      
	   
	  </ul>
	</section>
	
</aside> </div></div>
  <footer role="contentinfo"><p>
  Copyright &copy; 2014 -  -
  <span class="credit">Powered by <a target="_blank" href="http://www.mweb.im">MWeb</a> &nbsp;&nbsp; Theme by <a href="http://octopress.org">Octopress</a></span>
</p>

</footer>

  
    




</body>
</html>